Passed
Pull Request — master (#159)
by Mathieu
01:45
created

GetFairCalendarOverview   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 52
dl 0
loc 63
rs 10
c 0
b 0
f 0
wmc 11

2 Functions

Rating   Name   Duplication   Size   Complexity  
B index 0 36 6
A calculateNumberOfMealTicketsByDate 0 19 5
1
import { Inject } from '@nestjs/common';
2
import { FairCalendarView } from 'src/Application/FairCalendar/View/FairCalendarView';
3
import { Cooperative } from '../Settings/Cooperative.entity';
4
import { CooperativeNotFoundException } from '../Settings/Repository/CooperativeNotFoundException';
5
import { ICooperativeRepository } from '../Settings/Repository/ICooperativeRepository';
6
import { EventType } from './Event.entity';
7
import { ICalendarOverview } from './ICalendarOverview';
8
9
export class GetFairCalendarOverview {
10
  constructor(
11
    @Inject('ICooperativeRepository')
12
    private readonly cooperativeRepository: ICooperativeRepository
13
  ) {}
14
15
  public async index(items: FairCalendarView[]): Promise<ICalendarOverview> {
16
    const cooperative = await this.cooperativeRepository.find();
17
    if (!cooperative) {
18
      throw new CooperativeNotFoundException();
19
    }
20
21
    const itemsByDate = [];
22
    const overviewInDays: ICalendarOverview = {
23
      mission: 0,
24
      dojo: 0,
25
      formationConference: 0,
26
      leave: 0,
27
      support: 0,
28
      other: 0,
29
      mealTicket: 0
30
    };
31
32
    for (const {date, time, type: itemType, project} of items) {
33
      const dayIndex = new Date(date).getDate() - 1;
34
      const type = itemType.startsWith('leave_') ? 'leave' : itemType;
35
      const dayDuration = project ? project.dayDuration : cooperative.getDayDuration();
36
      const hours = time / dayDuration;
37
38
      if (itemsByDate[dayIndex]) {
39
        itemsByDate[dayIndex].push({ time, type });
40
      } else {
41
        itemsByDate[dayIndex] = [{ time, type }];
42
      }
43
44
      overviewInDays[type] = Math.round((overviewInDays[type] + hours) * 100) / 100;
45
    }
46
47
    return {
48
      ...overviewInDays,
49
      mealTicket: this.calculateNumberOfMealTicketsByDate(cooperative, Object.values(itemsByDate))
50
    };
51
  }
52
53
  private calculateNumberOfMealTicketsByDate(cooperative: Cooperative, itemsByDate: any[]): number {
54
    let mealTicket = 0;
55
56
    for (const sortedEvent of itemsByDate) {
57
      let totalPerDay = 0;
58
59
      for (const { time, type } of sortedEvent) {
60
        if (type !== EventType.OTHER && 'leave' !== type) {
61
          totalPerDay += time;
62
        }
63
      }
64
65
      if (totalPerDay > (cooperative.getDayDuration() / 2)) {
66
        mealTicket++;
67
      }
68
    }
69
70
    return mealTicket;
71
  }
72
}
73